package juego;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

import ar.uba.fi.algo3.titiritero.Dibujable;

//esta clase se encarga de que los moviles actuen,
//y de almacenar el puntaje
public class Coordinador {
	
	//atributos de clase
	private static int miPuntajeABatir = 1000;
	
	//atributos de instancia
	private Tripulado algo42;
	private int puntaje;
	private ArrayList<Movil> listaDeMoviles;
	private ArrayList<Botin> listaDeBotines;
	
	//metodos
	
	//constructor. recibe una lista con los aviones 
	//enemigos, los colaterales y el algo42. 
	//ademas recibe una referencia al algo42.
	//En la flota ya debe estar asignado el guia.
	//inserta al algo42 al frente
	//inicializa puntaje en 0.
//	public Coordinador(ArrayList<Movil> lista , Tripulado tripulado){
//		this.puntaje = 0;
//		this.algo42 = tripulado;
//		this.listaDeBotines = new ArrayList<Botin>();
//		this.listaDeMoviles = lista;
//				
//	}
	
	//constructor.
	//recibe una referencia al algo42.
	//inicializa puntaje en 0.
	public Coordinador(Tripulado tripulado){
		this.puntaje = 0;
		this.algo42 = tripulado;
		this.listaDeBotines = new ArrayList<Botin>();
		this.listaDeMoviles = new ArrayList<Movil>();
		this.listaDeMoviles.add(tripulado);
	}
	
	//devuelve true si el alo42 esta muerto
	public boolean murio(){
		return !this.algo42.estaVivo();
	}
	
	public int verPuntaje(){
		return this.puntaje;
	}
	
	//devuelve true si se alcanzo o supero el puntaje a batir
	public boolean puntajeAlcanzado(){
		return (this.puntaje >= miPuntajeABatir);
	}
	
	//inserta los moviles en una cola
	private Queue<Movil> acolarMoviles(){
		Iterator<Movil> iterador = this.listaDeMoviles.iterator();
		Queue<Movil> cola = new LinkedList<Movil>();
		while (iterador.hasNext()){
			Movil movil = iterador.next();
			cola.add(movil);
		}
		return cola;
	}
	
	//le da a los moviles acolados el mensaje vivir. recibe Queue<Movil> cola 
	private void vivirMovilesAcolados(Queue<Movil> cola){
		boolean seguir = true;
		Movil movil;
		while (seguir){
			try{
				movil = cola.remove();
				if (movil.estaVivo()){
					this.puntaje += movil.vivir(this.listaDeMoviles, this.listaDeBotines);
				}
			}
			//si el tripulado esta muerto lanza la excepcion para arriba
			catch(ExcepcionMuerto em){
				throw em;
			}
			//si la cola esta vacia
			catch(Exception e){
				seguir = false;
			}
		}
	}
	
	
		
	
	//se encarga de que los moviles vivan
	//lanza una excepcionMuerto si el algo42 estaba muerto.
	public void vivir() {
		Queue<Movil> cola = this.acolarMoviles();
		this.vivirMovilesAcolados(cola);
	};
	
		
	
	//agrega un movil a la lista 
	public void agregarMovil(Movil movil){
		this.listaDeMoviles.add(movil);
	}
	
	//agrega una flota de moviles a la lista
	public void agregarFlotas(ArrayList<Movil> otraListaDeMoviles){
		Iterator<Movil> iterador = otraListaDeMoviles.iterator();
		while (iterador.hasNext()){
			Movil movil = iterador.next();
			this.listaDeMoviles.add(movil);
			
		};
	};
	
		
	public boolean quedanNavesEnemigas(){
		Iterator<Movil> iterador = this.listaDeMoviles.iterator();
		boolean unaNaveEnemigaEncontrada = false;
		while ((iterador.hasNext()) && (!unaNaveEnemigaEncontrada)){
			Movil movil = iterador.next();
			if (movil.esNaveEnemiga()){
				unaNaveEnemigaEncontrada = true;
			};
		};
		return unaNaveEnemigaEncontrada;	
	}

	//devuelve una lista con los moviles y botines vivos
	public ArrayList<Dibujable> getDibujables() {
		ArrayList<Dibujable> listaDibujables = new ArrayList<Dibujable>();
		
		//agrego los moviles
		Iterator<Movil> iteMoviles = this.listaDeMoviles.iterator();
		while (iteMoviles.hasNext()){
			Movil movil = iteMoviles.next();
			//a cada movil le pido su dibujable
			Dibujable dibujable = movil.getDibujable(); 
			listaDibujables.add(dibujable);
		}
		
		//agrego a los botines
		Iterator<Botin> iteBotines = this.listaDeBotines.iterator();
		while (iteBotines.hasNext()){
			Botin botin = iteBotines.next();
			//a cada botin le pido su dibujable
			Dibujable dibujable = botin.getDibujable();
			listaDibujables.add(dibujable);
		}
		
		return listaDibujables;
		
		
	}

	
		
}
